/**
 * 接口描述了类的公共部分，而不是公共和私有两部分。 它不会帮你检查类是否具有某些私有成员
 * 定义接口的时候，普通的函数签名在实现的时候是可以的
 * 但是构造函数签名在实现的时候是不可以的
 * 因为当一个类实现了一个接口时，只对其实例部分进行类型检查。 
 * constructor存在于类的静态部分，所以不在检查的范围内
 * */ 
interface ClockInterface1 {
    // new (hour:number,minute:number):void;
    t()
}
class DigitalClock1 implements ClockInterface1{
    t(){

    }
    constructor(h:number,m:number){

    }
}

// 我想定义一个类的实现类型，必须要同时包含静态部分和实例部分的类型信息
// 需要创建两个接口，一个是实例接口，一个是构造函数接口
// 通过构造函数接口来约束类的静态部分，通过实例接口来约束类的实例部分
// 这样就可以完整的描述一个类的类型了
interface SquareInterface{
    color?:string;
    area:number;
    test():void;
    
}

// 构造函数类型,静态类型.new表示构造函数签名,返回值是实例类型
interface SquareConstructor{
    new (area:number,color:string):SquareInterface;
}

function createSquare(square:SquareConstructor,area:number,color:string):SquareInterface{
    return new square(area,color)
}

// 还是那句话，类实现接口的时候，只会对其实例部分进行类型检查
// constructor存在于类的静态部分，所以不在检查的范围内
// 所以这里不会报错
class Square implements SquareInterface{
    color?: string;
    area: number;
    constructor(area:number,b:string){
        
    }
    test(){

    }
}

let square = createSquare(Square,100,'red')
console.log(square)
